/*
 * @Author: yuki
 * @Date: 2025-10-26 10:04:01
 * @LastEditTime: 2025-10-26 16:41:44
 * @Description: token服务
 */

import { Injectable, Inject, UnauthorizedException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';

export interface ITokenPayload {
  sub: string; // ID（或其他唯一标识符）
  userId: string;
  username?: string; // 用户名（可选，根据需求添加）
  roles?: string[]; // 用户角色（可选，根据需求添加）
}

@Injectable()
export class TokenService {
  constructor(
    @Inject()
    private readonly jwtService: JwtService
  ) {}

  /**
   * 生成访问令牌（accessToken）- 短期有效
   * @param payload Token 携带的用户信息（建议仅包含 sub 等必要字段）
   */
  generateAccessToken(payload: ITokenPayload): string {
    return this.jwtService.sign(payload);
  }

  /**
   * 验证访问令牌并解析 payload
   * @param token 待验证的 accessToken
   * @throws UnauthorizedException 验证失败（过期、无效）
   */
  verifyAccessToken(token: string): ITokenPayload {
    try {
      return this.jwtService.verify<ITokenPayload>(token);
    } catch (_error) {
      // 验证失败（过期、签名错误等），抛出未授权异常
      throw new UnauthorizedException('访问令牌无效或已过期');
    }
  }
}
